home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / djgpp / libsrc / c / dos / dir.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-07-18  |  1.5 KB  |  81 lines

  1. #include <string.h>
  2. #include <dir.h>
  3. #include <dirent.h>
  4. #include <errno.h>
  5.  
  6. DIR *opendir(char *name)
  7. {
  8.   int length;
  9.   DIR *dir = (DIR *)malloc(sizeof(DIR));
  10.   dir->num_read = 0;
  11.   dir->name = (char *)malloc(strlen(name)+6);
  12.   strcpy(dir->name, name);
  13.  
  14.   /* Append a "." if we got only the device name */
  15.   if (dir->name[1] == ':' && strlen(dir->name) == 2)
  16.       strcat(dir->name, ".");
  17.  
  18.   /* Strip trailing slashes, so we can append "/*.*" */
  19.   while (1)
  20.   {
  21.       length = strlen(dir->name);
  22.       if (length == 0) break;
  23.       if (dir->name[length - 1] == '/' ||
  24.       dir->name[length - 1] == '\\')
  25.       dir->name[length - 1] = '\0';
  26.       else
  27.       break;
  28.   }
  29.  
  30.   strcat(dir->name, "/*.*");
  31.   return dir;
  32. }
  33.  
  34. struct dirent *readdir(DIR *dir)
  35. {
  36.   int done;
  37.   int oerrno = errno;
  38.   if (dir->num_read)
  39.     done = findnext(&dir->ff);
  40.   else
  41.     done = findfirst(dir->name, &dir->ff,
  42.              FA_ARCH|FA_RDONLY|FA_DIREC|FA_HIDDEN|FA_SYSTEM);
  43.   if (done)
  44.   {
  45.     if (errno == ENMFILE)
  46.       errno = oerrno;
  47.     return 0;
  48.   }
  49.   dir->num_read ++;
  50.   dir->de.d_namlen = strlen(dir->ff.ff_name);
  51.   strcpy(dir->de.d_name,dir->ff.ff_name);
  52.   strlwr(dir->de.d_name);
  53.   return &dir->de;
  54. }
  55.  
  56. long telldir(DIR *dir)
  57. {
  58.   return dir->num_read;
  59. }
  60.  
  61. void seekdir(DIR *dir, long loc)
  62. {
  63.   int i;
  64.   rewinddir(dir);
  65.   for (i=0; i<loc; i++)
  66.     readdir(dir);
  67. }
  68.  
  69. void rewinddir(DIR *dir)
  70. {
  71.   dir->num_read = 0;
  72. }
  73.  
  74. int closedir(DIR *dir)
  75. {
  76.   free(dir->name);
  77.   free(dir);
  78.   return 0;
  79. }
  80.  
  81.